package com.by.controller;

import cn.hutool.core.bean.BeanUtil;
import com.by.bean.Supplier;
import com.by.bean.User;
import com.by.common.bean.PageBean;
import com.by.common.bean.ResultBean;
import com.by.common.controller.BaseController;
import com.by.common.fileService.FileUploadService;
import com.by.common.group.ISave;
import com.by.common.group.IUpdate;
import com.by.common.query.EmpQuery;
import com.by.common.query.SupplierQuery;
import com.by.service.SupplierService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Map;

/**
 * @author Ye QS
 * @version 0.1
 * @className CustomerConroller
 * @description
 * @date 2024/9/13 17:13
 * @since jdk11
 */
@Api(tags = "供应商管理")
@RequestMapping("/v1")
@RestController
public class SupplierController extends BaseController {
    @Autowired
    SupplierService supplierService;

    //
//    /**
//     * 保存供应商信息
//     *
//     * @param supplier 供应商对象，包含要保存的供应商信息
//     * @param result   用于封装验证结果的对象，用于检查供应商对象的数据是否有效
//     * @return 返回保存结果，包括保存操作是否成功及可能的错误信息
//     */
//    @ApiOperation("保存供应商")
//    @PostMapping("/supplier")
//    public ResultBean save(@Validated(ISave.class) @RequestBody Supplier supplier, BindingResult result) {
//        // 校验输入数据的有效性
//        validate(result);
//        // 调用服务层方法保存供应商信息
//        int rs = supplierService.save(supplier);
//        // 根据保存结果生成并返回相应的结果对象
//        return saveResult(rs);
//    }
//    @PostMapping("/fileUp")
//    @RequestMapping(value = "/fileUp", method = RequestMethod.POST)
//    public ResultBean fileUp(@RequestParam("fileName") MultipartFile multipartFile, HttpServletRequest request) throws IOException {
//        // 获取文件部分的名称（即表单中的 name 属性）
//        String name = multipartFile.getName();
//        System.out.println(name);
//
//        // 获取上传文件的原始文件名
//        String originalFilename = multipartFile.getOriginalFilename();
//        System.out.println(originalFilename);
//
//        // 从文件对象中获取输入流
//        InputStream is = multipartFile.getInputStream();
//
//        // 使用 BufferedInputStream 包装输入流以提高读取效率
//        BufferedInputStream bis = new BufferedInputStream(is);
//
//        // 从 HTTP 请求中获取 ServletContext 对象
//        ServletContext application = request.getServletContext();
//
//        // 获取服务器上的实际路径，指向 "upload" 目录
//        String realPath = application.getRealPath("/upload");
//
//        // 创建一个 File 对象来表示上传目录
//        File file = new File(realPath);
//
//        // 如果上传目录不存在，则创建它
//        if (!file.exists()) {
//            file.mkdirs();
//        }
//
//        // 生成一个唯一的文件名，以避免文件覆盖问题
//        String uniqueFileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//
//        // 创建一个 File 对象来表示目标文件（即上传文件）
//        File destFile = new File(file.getAbsolutePath() + "/" + uniqueFileName);
//
//        // 使用 BufferedOutputStream 包装输出流以提高写入效率
//        BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(destFile.toPath()));
//
//        // 定义缓冲区大小为 10 KB
//        byte[] bytes = new byte[1024 * 10];
//
//        int readCount = 0;
//        while ((readCount = bis.read(bytes)) != -1) {
//            // 将从输入流读取的数据写入到输出流
//            bos.write(bytes, 0, readCount);
//        }
//
//        // 刷新并关闭输出流
//        bos.flush();
//        bos.close();
//
//        // 关闭输入流
//        bis.close();
//
//        // 返回 "ok" 表示文件上传成功
//        return success("文件营业执照上传成功");
//    }

    /**
     * 保存供货商额同时将供货商的logo和营业执照写到服务器端，
     * 并将在服务器中的地址写到数据库
     *
     * @param supplier
     * @param license
     * @param logo
     * @param result
     * @return
     * @throws IOException
     */
    @ApiOperation("保存供应商")
    @PostMapping("/supplier")
    public ResultBean save(@Validated(ISave.class) @ModelAttribute Supplier supplier, @RequestParam(value = "license", required = true) MultipartFile license, @RequestParam(value = "logo", required = true) MultipartFile logo, BindingResult result) throws IOException {
        // 校验输入数据的有效性
        validate(result);

        // 调用服务层方法保存供应商信息及其相关文件
        int rs = supplierService.save(supplier, license, logo);

        // 根据保存结果生成并返回相应的结果对象
        return saveResult(rs);
    }


    @ApiImplicitParam(name = "id", value = "供应商id", required = true, defaultValue = "0", dataTypeClass = Integer.class)
    @ApiOperation("删除供应商")
    @DeleteMapping("/supplier")
    public ResultBean delete(@ApiParam(name = "id", required = true, value = "要删除的id") @RequestParam(name = "id", required = true, defaultValue = "0") int id) {
        int rs = supplierService.delete(id);
        return deleteResult(rs);
    }

    @ApiOperation("修改供货商信息")
    @PutMapping("/supplier")
    public ResultBean update(@Validated(IUpdate.class) @RequestBody Supplier supplier, BindingResult result) {
        validate(result);
        int rs = supplierService.update(supplier);
        return updateResult(rs);
    }

    @ApiOperation("供货商列表")
    @PostMapping("/supplier/query")
    public ResultBean query(@RequestBody SupplierQuery query) {
        // 将传入的 EmpQuery 对象转换成 Map 结构，便于后续处理使用。
        Map<String, Object> map = BeanUtil.beanToMap(query);

        // 调用 employeeService 中定义的方法 query 进行员工信息查询，并接收返回的分页数据。
        PageBean pageBean = supplierService.query(map);

        // 构造并返回一个包含自定义消息和实际查询结果的成功响应对象。
        return success("供货商列表", pageBean);
    }

    @ApiOperation("重置密码")
    @PutMapping("/supplier/resetPassword")
    public ResultBean resetPassword(@Validated(IUpdate.class) @RequestBody User user, BindingResult result) {
        validate(result);
        int rs = supplierService.resetPassword(user);
        return updateResult(rs);
    }
}
